const checkAuth = async function (ctx, next) {
  // 1.  获取参数 ws://localhost:7001/ws?token=123456
  let user = {};
  const token = ctx.query.token;
  // 2. 验证token是否存正确以及用户是否有可用
  if (!token) {
    ctx.websocket.send(
      JSON.stringify({
        msg: 'fail',
        data: '连接需要传入token'
      })
    );
    return ctx.websocket.close();
  }
  try {
    user = ctx.checkToken(token);
    const userCheck = await ctx.app.model.User.findByPk(user.id);
    if (!userCheck) {
      ctx.websocket.send(
        JSON.stringify({
          msg: 'fail',
          data: 'token无效'
        })
      );
      return ctx.websocket.close();
    }
    if (!userCheck.status) {
      ctx.websocket.send(
        JSON.stringify({
          msg: 'fail',
          data: '用户已被禁用'
        })
      );
      return ctx.websocket.close();
    }
    // 3. 判断用户是否以在其他设备上登录
    ctx.app.ws.user = ctx.app.ws.user ? ctx.app.ws.user : {};
    if (ctx.app.ws.user[user.id]) {
      ctx.websocket.send(
        JSON.stringify({
          msg: 'fail',
          data: '用户已在其他设备上登录'
        })
      );
      ctx.app.ws.user[user.id].close();
    }
    // 4. 绑定用户
    ctx.websocket.user_id = user.id;
    ctx.app.ws.user[user.id] = ctx.websocket;
    await next();
  } catch (err) {
    const fail =
      err.name === 'TokenExpiredError'
        ? 'token 已过期! 请重新获取令牌'
        : 'Token 令牌不合法!';
    ctx.websocket.send(
      JSON.stringify({
        msg: 'fail',
        data: '系统错误' + fail
      })
    );
    // 关闭连接
    ctx.websocket.close();
  }
};
module.exports = checkAuth;
